package com.xq.string;

/**
 * @author jltxseo
 *         Created by junlintianxia on 2017/07/09.
 *       String：查看源码得知，String类的声明是：public final，所以可以很清楚的知道，fianl的话是改变不了的，
 *       所以，如果我们用String来操作字符串的时候，一旦我们字符串的值改变，就会在内存创建多一个空间来保存新的字符串，
 *       可想而知，一旦遇到复杂的操作，用String是多么低效率的事啊！
 *
 *       所以，一般涉及到字符串操作的，我们一般使用StringBuffer或者StringBuilder，但是这两者都又有什么区别呢，
 *       下面我来说说：
 *       StringBuffer和StringBuilder都集成了AbstractStringBuilder，而StringBuffer大部分方法都是synchronized，也就是线程安全的，而StringBuilder就没有，
 *       所以，我们查看API可以知道，StringBuilder可以操作StringBuffer，
 *       但是StringBuffer不可以操作StringBuilder，这也是线程的原因；
 *       所以，可想而知，StringBuffer的效率肯定没有StringBuilder，
 *       因为StringBuffer要维持同步锁，这肯定要消耗部分资源，下面这个例子就可以充分证明这三者之间的关系：
 */

public class StringBufferWithBuilder {
    public void testString() {
        long start = System.currentTimeMillis();
        String str = null;
        for (int i = 0; i < 20000; i++) {
            str = str + i + ",";
        }
        System.out.println(System.currentTimeMillis() - start);
    }


    public void testStringBuffer() {
        long start = System.currentTimeMillis();

        StringBuffer sbuf = new StringBuffer();
        for (int i = 0; i < 20000; i++) {
            sbuf.append(i + ",");
        }
        System.out.println(System.currentTimeMillis() - start);
    }

    public void testStringBulider() {
        long start = System.currentTimeMillis();

        StringBuilder builder = new StringBuilder();
        for (int i = 0; i < 20000; i++) {
            builder.append(i + ",");
        }
        System.out.println(System.currentTimeMillis() - start);
    }

    public static void main(String[] args){
        StringBufferWithBuilder stringBufferWithBuilder = new StringBufferWithBuilder();
        stringBufferWithBuilder.test();
    }


    public void test(){
        testString();
        testStringBuffer();
        testStringBulider();
    }

}
